#include "BonusCambioDePresa.h"

#include "IteradorLista.h"
#include "EscenarioModelo.h"
#include "Juego.h"

BonusCambioDePresa::BonusCambioDePresa(Punto* unPunto,unsigned int unRadio, bool vivo) : BonusModel(unPunto,unRadio,vivo){

}

void BonusCambioDePresa::colisionarConPacman(ObjetoVivo* unObjetoVivo) {
    Pacman* elPacman = (Pacman*)unObjetoVivo;
    Lista<Fantasma>* fantasmas = NULL;
    Pacman* laOtraPresa = NULL;

	if(elPacman->equals(EscenarioModelo::getEscenario()->getPacmanJugador1())){        
        //fantasmas = (Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador1();
        laOtraPresa = EscenarioModelo::getEscenario()->getPacmanJugador2();    
    }else{
        //fantasmas = (Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador2();
        laOtraPresa = EscenarioModelo::getEscenario()->getPacmanJugador1();
    }

	this->invertirPresa((Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador1(),elPacman,laOtraPresa);
	this->invertirPresa((Lista<Fantasma>*)EscenarioModelo::getEscenario()->getFantasmasJugador2(),elPacman,laOtraPresa);
	
	this->matar();
}

void BonusCambioDePresa::invertirPresa(Lista<Fantasma>* lista, Pacman* beneficiario, Pacman* looser){
	IteradorLista<Fantasma> it = lista->iterador();
    while(it.tieneSiguiente()){
        
        Fantasma* f = it.siguiente();
		if(f->getPresa()->equals(beneficiario)){
			
			// Si agarre este bonus y el otro el limon entonces se puede comer mis fantasmas
			//if(!looser->estaSiendoCazado())
			//	f->setEstaSiendoCazado(true);

			f->setPresa(looser);
			f->getEstrategiaMovimiento()->setPresa(looser);

			Uint32* argumentos = new Uint32[2];
			memcpy(&argumentos[0],&(this->duracionEfecto),sizeof(Uint32));
			memcpy(&argumentos[1],&f,sizeof(Uint32));
			SDL_Thread* thread = SDL_CreateThread(BonusCambioDePresa::volverAPresaOriginalThread, argumentos);

			// Se agrega el thread a la lista de thread para luego terminarlo si queda vivo.
			Juego::listaThreads->agregar(thread);
		}
		
    }
}

int BonusCambioDePresa::volverAPresaOriginalThread(void* parametros){
        Uint32* arregloParametros = (Uint32*)parametros;

        Uint32 delay = (Uint32)arregloParametros[0];
        Fantasma* fantasma = (Fantasma*)arregloParametros[1];

        SDL_Delay(delay);
        
		fantasma->cambiarALaPresaOriginal();
		fantasma->getEstrategiaMovimiento()->setPresa(fantasma->getPresaOriginal());
		
		// Cuando reestablezco la persecucion, si el original esta siendo cazado entonces el fantasma no
		//if(fantasma->getPresaOriginal()->estaSiendoCazado())
		//	fantasma->setEstaSiendoCazado(false);

		delete[] arregloParametros ;
        
        return 0;
}

void BonusCambioDePresa::colisionarConFantasma(ObjetoVivo* unObjetoVivo){
    

}

BonusCambioDePresa::~BonusCambioDePresa(){
    
}